package com.heima.auth.service.impl;
import com.alibaba.fastjson.JSON;
import com.heima.auth.common.enums.AppHttpCodeEnum;
import com.heima.auth.common.result.ResponseResult;
import com.heima.auth.config.GreenScan;
import com.heima.auth.pojo.AuthContent;
import com.heima.auth.pojo.ScanResult;
import com.heima.auth.pojo.WmNews;
import com.heima.auth.service.AuthService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class AuthServiceImpl implements AuthService {
    @Autowired
    GreenScan greenScan;
    @Override
    public ResponseResult<ScanResult> wmNewsAuth(WmNews wmNews) {
        // 1. 抽取所有文本和内容
        Map contentAndImages = parseContentAndImages(wmNews); //  文本信息    List<String>
            // 2.TODO DFA审核敏感词(未做)  须通过feign接口  调用admin服务 获取敏感词检测结果信息
        try {
            // 3. 阿里云审核文本内容
            ScanResult scanResult = greenScan.greenTextScan((String)contentAndImages.get("content"));
            // 4. 阿里云审核图片内容
            String suggestion = scanResult.getSuggestion();
            if (!"pass".equals(suggestion)){
                return ResponseResult.okResult(scanResult);
            }
            List<String> imageList = (List<String>)contentAndImages.get("images");
            if(!CollectionUtils.isEmpty(imageList)){
                scanResult = greenScan.imageUrlScan(imageList);
            }
            return ResponseResult.okResult(scanResult);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.errorResult(AppHttpCodeEnum.ALIYUN_AUTH_ERROR);
        }
    }

    @Override
    public ResponseResult<ScanResult> wmNewsAuthText(AuthContent authContent) {
        String content = authContent.getContent();
        // 3. 阿里云审核文本内容
        ScanResult scanResult = null;
        try {
           scanResult = greenScan.greenTextScan(content);
        } catch (Exception e) {
            e.printStackTrace();
            scanResult = new ScanResult();
            scanResult.setSuggestion("review");
            scanResult.setReason("阿里云接口出现异常，请进行人工审核");
        }
        return ResponseResult.okResult(scanResult);
    }

    @Override
    public ResponseResult<ScanResult> wmNewsAuthImages(AuthContent authContent) {
        List<String> imageList = authContent.getImages();
        if(CollectionUtils.isEmpty(imageList)){
            return ResponseResult.errorResult(AppHttpCodeEnum.ALIYUN_AUTH_ERROR,"参数不能为空");
        }
        ScanResult scanResult = null;
        try {
            scanResult = greenScan.imageUrlScan(imageList);
        } catch (Exception e) {
            e.printStackTrace();
            scanResult = new ScanResult();
            scanResult.setSuggestion("review");
            scanResult.setReason("阿里云接口出现异常，请进行人工审核");
        }
        return ResponseResult.okResult(scanResult);
    }

    /**
     * 抽取文章内容 和  图片路径集合的方法
     * @param wmNews
     * @return
     */
    private Map parseContentAndImages(WmNews wmNews) {
        List<Map> contentMapList = JSON.parseArray(wmNews.getContent(), Map.class);
        // 1. 抽取文章的所有文本内容
        // 家乡好美_hmtt_国家伟大
        String content = contentMapList.stream()
                // [{type:text,value:文本内容},{type:image,value:图片},{type:text,value:文本内容}]
                .filter(m -> "text".equals(m.get("type")))
                // [{type:text,value:文本内容},{type:text,value:文本内容}]
                .map(m -> String.valueOf(m.get("value")))
                // [文本内容,文本内容]
                .collect(Collectors.joining("_hmtt_"));
        //文本内容_hmtt_文本内容_hmtt_文章标题

        //    文章标题  +  文章内容中的文本部分
        content += "_hmtt_" + wmNews.getTitle();
        // 2. 抽取文章的所有图片路径
        List<String> images = contentMapList.stream()
                // [{type:text,value:文本内容},{type:image,value:图片},{type:text,value:文本内容}]
                .filter(m -> "image".equals(m.get("type")))
                // [{type:image,value:图片}]
                .map(m -> String.valueOf(m.get("value")))
                // [图片路径]
                .collect(Collectors.toList());
        //    文章封面图片路径 + 文章内容中的图片路径
        String coverStr = wmNews.getImages();
        if (StringUtils.isNotBlank(coverStr)) {
            // material/2022/7/20220728/3787d5ef88ad4e8cbbbb30ddeb35b1e80001.jpg
            // webSite + 图片相对路径.jpg    ,    图片相对路径.jpg,     图片相对路径.jpg
            // 1. 按照逗号切割  得到数组
            // 2. 基于数组 获取流对象
            // 3. 使用map映射方法，将每个路径添加访问前缀
            // 4. 收集到一个集合中
            List<String> coverImages = Arrays.stream(coverStr.split(","))
                    .collect(Collectors.toList());
            // 将内容图片路径 和 封面图片路径合到一起
            images.addAll(coverImages);
        }
        // 去除重复图片
        images = images.stream()
                .distinct()
                .collect(Collectors.toList());

        Map result = new HashMap();
        result.put("content",content);
        result.put("images",images);
        return result;
    }
}
